package org.farec.tcc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.farec.tcc.modelo.Cliente;
import org.farec.tcc.modelo.Ocorrencia;

public class PesquisaDAO {
	
	private Connection connection;
	
	public PesquisaDAO(Connection connection)
	{
		this.connection=connection;
	}
	
	public List<Ocorrencia> getOcorrenciaPorCodigo(int codigo)
	{
		try
		{
			
			String sql = "SELECT t2.id, t1.razao,nomefant,operador,dataabertura,datafechamento,prioridade, t2.status, t2.tipo, t2.descricao " 
						  +"from cliente as t1, incidente as t2 where t1.id=? and t1.razao=t2.cliente UNION "
						  + "SELECT t2.id, t1.razao, nomefant,operador,dataabertura,datafechamento,prioridade, t2.status,t2.tipo, t2.descricao "
						  +"from cliente as t1, solicitacao as t2 where t1.id=? and t1.razao=t2.cliente;";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setInt(1, codigo);
			stmt.setInt(2, codigo);
			
			List<Ocorrencia> ocorrenciaList = new ArrayList<>();
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next())
			{
				//Cria o objetoc
				Ocorrencia ocorrencia = new Ocorrencia();
				
				ocorrencia.setCodigo(rs.getInt("id"));
				ocorrencia.setCliente(rs.getString("razao"));
				ocorrencia.setClienteFantasia(rs.getString("nomefant"));
				ocorrencia.setOperador(rs.getString("operador"));
				
				//Montado o Calendar
				Calendar dataAbertura = Calendar.getInstance();
				Calendar dataFechamento = Calendar.getInstance();
				dataAbertura.setTime(rs.getDate("dataabertura"));
				ocorrencia.setDataAbertura(dataAbertura);
				
				if(rs.getDate("datafechamento") != null )
				{
					dataFechamento.setTime(rs.getDate("datafechamento"));
					ocorrencia.setDataFechamento(dataFechamento);
				}
				ocorrencia.setPrioridade(rs.getString("prioridade"));
				ocorrencia.setStatus(rs.getString("status"));
				ocorrencia.setTipo(rs.getString("tipo"));
				ocorrencia.setDescricao(rs.getString("descricao"));
				
				ocorrenciaList.add(ocorrencia);
				
			}
			
			return ocorrenciaList;	
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}

	}

	public List<Ocorrencia> getOcorrenciaPorRazao(String razao)
	{
		try
		{
			
			String sql = "SELECT t2.id, t1.razao,nomefant,operador,dataabertura,datafechamento,prioridade, t2.status, t2.tipo, t2.descricao " 
						  +"from cliente as t1, incidente as t2 WHERE t1.razao ILIKE ? and t1.razao=t2.cliente UNION "
						  + "SELECT t2.id, t1.razao, nomefant,operador,dataabertura,datafechamento,prioridade, t2.status,t2.tipo, t2.descricao "
						  +"from cliente as t1, solicitacao as t2	where t1.razao ILIKE ? and t1.razao=t2.cliente;";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, "%"+razao+"%");
			stmt.setString(2, "%"+razao+"%");
			
			List<Ocorrencia> ocorrenciaList = new ArrayList<>();
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next())
			{
				//Cria o objetoc
				Ocorrencia ocorrencia = new Ocorrencia();
				
				ocorrencia.setCodigo(rs.getInt("id"));
				ocorrencia.setCliente(rs.getString("razao"));
				ocorrencia.setClienteFantasia(rs.getString("nomefant"));
				ocorrencia.setOperador(rs.getString("operador"));
				
				//Montado o Calendar
				Calendar dataAbertura = Calendar.getInstance();
				Calendar dataFechamento = Calendar.getInstance();
				dataAbertura.setTime(rs.getDate("dataabertura"));
				ocorrencia.setDataAbertura(dataAbertura);
				
				if(rs.getDate("datafechamento") != null )
				{
					dataFechamento.setTime(rs.getDate("datafechamento"));
					ocorrencia.setDataFechamento(dataFechamento);
				}
				ocorrencia.setPrioridade(rs.getString("prioridade"));
				ocorrencia.setStatus(rs.getString("status"));
				ocorrencia.setTipo(rs.getString("tipo"));
				ocorrencia.setDescricao(rs.getString("descricao"));
				
				ocorrenciaList.add(ocorrencia);
				
			}
			
			return ocorrenciaList;	
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}

	}

	public List<Ocorrencia> getOcorrenciaPorCnpj(String cnpj)
	{
		try
		{
			
			String sql = "SELECT t2.id, t1.razao,nomefant,operador,dataabertura,datafechamento,prioridade, t2.status, t2.tipo, t2.descricao " 
						  +"from cliente as t1, incidente as t2 where t1.cnpj like ? and t1.razao=t2.cliente UNION "
						  + "SELECT t2.id, t1.razao, nomefant,operador,dataabertura,datafechamento,prioridade, t2.status,t2.tipo, t2.descricao "
						  +"from cliente as t1, solicitacao as t2	where t1.cnpj like ? and t1.razao=t2.cliente;";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, "%"+cnpj+"%");
			stmt.setString(2, "%"+cnpj+"%");
			
			List<Ocorrencia> ocorrenciaList = new ArrayList<>();
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next())
			{
				//Cria o objetoc
				Ocorrencia ocorrencia = new Ocorrencia();
				
				ocorrencia.setCodigo(rs.getInt("id"));
				ocorrencia.setCliente(rs.getString("razao"));
				ocorrencia.setClienteFantasia(rs.getString("nomefant"));
				ocorrencia.setOperador(rs.getString("operador"));
				
				//Montado o Calendar
				Calendar dataAbertura = Calendar.getInstance();
				Calendar dataFechamento = Calendar.getInstance();
				dataAbertura.setTime(rs.getDate("dataabertura"));
				ocorrencia.setDataAbertura(dataAbertura);
				
				if(rs.getDate("datafechamento") != null )
				{
					dataFechamento.setTime(rs.getDate("datafechamento"));
					ocorrencia.setDataFechamento(dataFechamento);
				}
				ocorrencia.setPrioridade(rs.getString("prioridade"));
				ocorrencia.setStatus(rs.getString("status"));
				ocorrencia.setTipo(rs.getString("tipo"));
				ocorrencia.setDescricao(rs.getString("descricao"));
				
				ocorrenciaList.add(ocorrencia);
				
			}
			
			return ocorrenciaList;	
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}

	}

	public List<Ocorrencia> getOcorrenciaDoCliente(Cliente cliente)
	{
		try
		{
			
			String sql = "SELECT t2.id,area,categoria,descricao,unidade,local,dataabertura,datafechamento,t2.status, t2.tipo " 
						  +"from cliente as t1, incidente as t2 where t1.razao=? and t1.razao=t2.cliente UNION "
						  + "SELECT t2.id,area,categoria,descricao,unidade,local,dataabertura,datafechamento,t2.status, t2.tipo "
						  +"from cliente as t1, solicitacao as t2 where t1.razao=? and t1.razao=t2.cliente order by id desc;";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, cliente.getRazao());
			stmt.setString(2, cliente.getRazao());
			
			List<Ocorrencia> ocorrenciaList = new ArrayList<>();
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next())
			{
				//Cria o objetoc
				Ocorrencia ocorrencia = new Ocorrencia();
				
				ocorrencia.setCodigo(rs.getInt("id"));
				ocorrencia.setArea(rs.getString("area"));
				ocorrencia.setCategoria(rs.getString("categoria"));
				ocorrencia.setDescricao(rs.getString("descricao"));
				ocorrencia.setUnidade(rs.getString("unidade"));
				ocorrencia.setLocal(rs.getString("local"));
				
				//Montado o Calendar
				Calendar dataAbertura = Calendar.getInstance();
				Calendar dataFechamento = Calendar.getInstance();
				dataAbertura.setTime(rs.getDate("dataabertura"));
				ocorrencia.setDataAbertura(dataAbertura);
				
				if(rs.getDate("datafechamento") != null )
				{
					dataFechamento.setTime(rs.getDate("datafechamento"));
					ocorrencia.setDataFechamento(dataFechamento);
				}

				ocorrencia.setStatus(rs.getString("status"));
				ocorrencia.setTipo(rs.getString("tipo"));
				
				ocorrenciaList.add(ocorrencia);
				
			}
			
			return ocorrenciaList;	
		}
		catch(SQLException e)
		{
			throw new RuntimeException(e);
		}

	}
}
